package com.assistant.query.service.impl;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.assistant.common.Constants;
import com.assistant.common.utils.HttpClient;
import com.assistant.common.utils.uuid.Seq;
import com.assistant.query.service.QueryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname QueryServiceImpl
 * @Description TODO
 * @Date 2025/3/4 10:28
 * @Created by xxx
 */
@Service
@Slf4j
public class QueryServiceImpl implements QueryService {
    @Value("${file.path0}")
    private String fileDir;

    public static String extractDate(String input) {
        // 定义多种日期格式
        DateTimeFormatter[] formatters = {
                DateTimeFormatter.ofPattern("yyyy年MM月"),
                DateTimeFormatter.ofPattern("yyyy年M月"),
                DateTimeFormatter.ofPattern("yyyy年MM月"),
                DateTimeFormatter.ofPattern("yyyy年M月"),
                DateTimeFormatter.ofPattern("yyyy-MM"),
                DateTimeFormatter.ofPattern("yyyy/M"),
                DateTimeFormatter.ofPattern("yyyy.MM"),
                DateTimeFormatter.ofPattern("yyyy-M"),
                DateTimeFormatter.ofPattern("yyyyMM")
        };

        for (DateTimeFormatter formatter : formatters) {
            try {
                // 尝试使用每种格式解析日期
                LocalDate date = LocalDate.parse(input, formatter);
                // 返回格式化的 "YYYYMM"
                return date.format(DateTimeFormatter.ofPattern("yyyyMM"));
            } catch (DateTimeParseException e) {
                // 如果解析失败，尝试下一个格式
                continue;
            }
        }
        // 如果所有格式都无法匹配，返回 null
        return null;
    }

    public static String extractAndFormatDate(String input) {
        // 正则表达式匹配以下格式：
        // 1. 年/月（2025年06月、2025-06、2025/6）
        // 2. 六位连续数字（202506）
        // 3. 点号分隔（2025.6）
        Pattern pattern = Pattern.compile(
                "(\\d{4})[年/-](0?[1-9]|1[0-2])(?:月|\\b)|" +  // 格式1
                        "(\\d{4})(0[1-9]|1[0-2])(?!\\d)|" +            // 格式2（六位数）
                        "(\\d{4})\\.(0?[1-9]|1[0-2])(?!\\d)"           // 格式3（点号分隔）
        );
        Matcher matcher = pattern.matcher(input);

        if (!matcher.find()) {
            return null;
        }

        String year = null;
        String monthStr = null;

        // 判断匹配的分组
        if (matcher.group(1) != null) {  // 格式1
            year = matcher.group(1);
            monthStr = matcher.group(2);
        } else if (matcher.group(3) != null) {  // 格式2
            year = matcher.group(3);
            monthStr = matcher.group(4);
        } else if (matcher.group(5) != null) {  // 格式3
            year = matcher.group(5);
            monthStr = matcher.group(6);
        } else {
            return null;
        }

        // 转换并校验月份
        int month = Integer.parseInt(monthStr);
        if (month < 1 || month > 12) {
            return null;
        }

        // 格式化为yyyyMM
        return year + String.format("%02d", month);
    }

    @Override
    public String query(String question) {
        String url = Constants.Q_URL;
        String date = extractAndFormatDate(question);
        if (date == null) {
            return Constants.DATE_FORMAT_FAIL;
        }
        Path path = Paths.get(fileDir, date + Constants.CSV);
        File file = path.toFile();
        if (!file.exists()) {
            return Constants.FILE_NOT_EXIST;
        }
        Map<String, File> fileParams = new HashMap<>();
        fileParams.put("file", file);
        String fileId = Seq.generate();
        Map<String, String> formParams = new HashMap<>();
        formParams.put("fileId", fileId);
        formParams.put("query", question);
        formParams.put("file_replace", Constants.REPLACE);
        JSONObject result;
        try {
            String ans = HttpClient.doPostWithFiles(url, formParams, fileParams);
            result = JSON.parseObject(ans);
        } catch (IOException e) {
            log.error("查询失败：{}", e.getMessage());
            return "查询失败：网络请求异常";
        } catch (Exception e) {
            log.error("查询失败：{}", e.getMessage());
            return "查询失败：解析结果异常";
        }
        log.info("查询结果：{}", result);
        if (result == null) {
            return "查询失败：返回结果为空";
        }
        String code = result.getString("code");
        if (!"0".equals(code)) {
            String msg = result.getString("msg");
            log.error("查询失败：{}", msg);
            return "查询失败：" + msg;
        }
        log.info("查询成功：{}", result.getString("content"));
        return result.getString("content");
    }
}
